home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Day Cry
/
Day Cry CD.bin
/
oh_towns
/
taropyon
/
splib
/
splib.lzh
/
PRG
/
LHX
/
MATCH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-08
|
4KB
|
186 lines
/***********************************************************
match.c -- match filenames
***********************************************************/
#include "lh386.h"
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <ctype.h>
#include "lh.h"
#include "errmes.h"
#ifdef __HIGHC__
# pragma On(Align_labels);
#endif
struct pat *pbuf;
static struct pat *pnxt, *plst;
/***************************************
initialize pattern pointers
***************************************/
void initpat(void)
{
pbuf = plst = e_malloc(sizeof(struct pat *));
pbuf->nxt = NULL;
}
/***************************************
regist file matching pattern
***************************************/
void regpat(char *pattern, char *bdir)
{
char *p;
p = getfilename(pattern);
pnxt = e_malloc(strlen(pattern) + sizeof(struct pat));
pnxt->nxt = NULL;
pnxt->bdir = bdir;
pnxt->cnt = 0;
strcpy(pnxt->pname, pattern);
pnxt->fname = pnxt->pname + (p - pattern);
plst = plst->nxt = pnxt;
}
/***************************************
regist base directory
****************************************
bdir : base directory
return : saved address
***************************************/
char *regbdir(char *bdir)
{
char *p;
p = e_malloc(strlen(bdir) + 1);
strcpy(p, bdir);
return p;
}
/***************************************
match filename to pattern
including wild cards
pname : filename in the pattern
fname : filename given
***************************************/
char *matchfname(char *pname, char *fname)
{
char *f;
f = fname;
for (; *pname; pname++)
{
switch (*pname)
{
case '*':
while (*fname != '.' &&
(uchar) * fname != DELIM && *fname)
fname++;
break;
case '?':
if (*fname != '.' &&
(uchar) * fname != DELIM && *fname)
fname++;
break;
case '.':
if ((uchar) * fname == DELIM || *fname == '\0')
break;
default:
if ((*pname != *fname) &&
(flg_i || toupper(*pname) != toupper(*fname)))
{
return f; /* not NUL */
}
fname++;
}
}
return fname;
}
/***************************************
match pathname to pattern
****************************************
path : pathname
return : it's base directory
***************************************/
char *matchpat(char *path)
{
struct pat *pt;
char *p, *r;
char *file, *q;
char c;
file = getfilename(path);
for (pt = pbuf->nxt; pt != NULL; pt = pt->nxt)
{
p = pt->pname;
switch (flg_r)
{
case 0:
if (pt->fname == p && flg_p == 0)
{
q = matchfname(p, file);
} else
{
q = matchfname(p, path);
}
if (*q)
q = NULL;
break;
case 1:
c = *(r = pt->fname);
*r = '\0';
q = matchfname(p, path);
*r = c;
if (q)
{
q = matchfname(pt->fname, file);
if (*q)
q = NULL;
}
break;
case 2:
q = matchfname(p, path);
if (*q && (uchar) * q != DELIM)
q = NULL;
break;
}
if (q)
return (pt->bdir);
}
return NULL;
}
/***************************************
whether pattern was used or not
****************************************
return 0 : all pattern was used
1 : some pattern not used
***************************************/
int tstpat(void)
{
int cnt;
int errorlevel;
struct pat *pt;
cnt = 0;
for (pt = pbuf->nxt; pt != NULL; pt = pt->nxt)
cnt += pt->cnt;
if (cnt == 0) /* no file matched */
error(NOFILEERR, NULL);
for (pt = pbuf->nxt; pt != NULL; pt = pt->nxt)
{
if (pt->cnt == 0)
{ /* if any work name was not used */
strcpy(work, pt->pname);
LHX_fprintf(stderr, "%s : '%s'\n", NOMATCHERR, work);
errorlevel = 1; /* display warning */
}
}
return errorlevel;
}